#ifndef TOASTNOTIFICATION_H
#define TOASTNOTIFICATION_H

#include <QWidget>
#include <QLabel>
#include <QTimer>
#include <QPropertyAnimation>
#include <QScreen>
#include <QFontMetrics>

/**
 * Toast通知管理器 - 统一的轻量级提示系统
 *
 * Martin Fowler重构原则：
 * 1. 单一职责：专门处理Toast提示的显示和管理
 * 2. 简单接口：提供静态方法便于调用
 * 3. 自动管理：生命周期自动化，无需手动清理
 * 4. 统一设计：简洁大方的现代化样式
 */
class ToastNotification : public QWidget
{
    Q_OBJECT

public:
    // Toast类型 - 清晰表达意图
    enum class ToastType {
        Info,       // 信息提示（简洁蓝色）
        Warning,    // 警告提示（简洁橙色）
        Error,      // 错误提示（简洁红色）
        Success     // 成功提示（简洁绿色）
    };

    // Martin Fowler重构：便利方法 - 简化调用接口
    static void showInfo(QWidget* parent, const QString& message, int duration = 3000);
    static void showWarning(QWidget* parent, const QString& message, int duration = 4000);
    static void showError(QWidget* parent, const QString& message, int duration = 5000);
    static void showSuccess(QWidget* parent, const QString& message, int duration = 3000);

    // 通用方法 - 替代MainWindow的自定义toast
    static void show(QWidget* parent, const QString& message, ToastType type = ToastType::Info, int duration = 3000);

    // 单例模式方法 - 避免样式被覆盖
    static ToastNotification* instance();
    static void destroyInstance();

private:
    explicit ToastNotification(QWidget* parent = nullptr);
    ~ToastNotification();

    // 内部方法
    void setupUI(ToastType type, const QString& message);
    void animateShow();
    void animateHide();

    // 样式设置
    QString getStyleSheet(ToastType type) const;
    QString getModernStyleSheet(ToastType type) const;

    // 重写paintEvent确保背景始终正确绘制
    void paintEvent(QPaintEvent* event) override;

    // 现代化设计方法
    QSize calculateOptimalSize(const QString& message) const;
    int getDPIScaledSize(int baseSize) const;
    QString getToastIcon(ToastType type) const;
    int calculateOptimalDuration(const QString& message) const;

private slots:
    void onAnimationFinished();

private:
    QLabel* m_messageLabel;
    QPropertyAnimation* m_showAnimation;
    QPropertyAnimation* m_hideAnimation;
    QPropertyAnimation* m_scaleAnimation;    // 新增缩放动画
    QTimer* m_autoHideTimer;
    ToastType m_currentType;

    // 单例支持
    static ToastNotification* s_instance;
    
    // Toast堆叠管理
    static int s_toastCount; // 当前显示的Toast数量

    // 现代化毛玻璃Toast设计参数
    static const int MIN_TOAST_WIDTH = 300;
    static const int MAX_TOAST_WIDTH_RATIO = 60; // 屏幕宽度的60%
    static const int TOAST_PADDING = 24;
    static const int TOAST_SPACING = 12;
    static const int CORNER_RADIUS = 16;
    static const int FONT_SIZE_BASE = 14; // 96 DPI基准
};

// 便利宏 - 简化调用
#define ToastInfo(message) ToastNotification::showInfo(this, message)
#define ToastWarning(message) ToastNotification::showWarning(this, message)
#define ToastError(message) ToastNotification::showError(this, message)
#define ToastSuccess(message) ToastNotification::showSuccess(this, message)

#endif // TOASTNOTIFICATION_H